package br.com.conhecimento.ejb.service;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import br.com.conhecimento.core.data.GestaoDemandaClienteDao;
import br.com.conhecimento.core.data.GestaoDemandaFlagDao;
import br.com.conhecimento.core.data.GestaoDemandaPendenciaDao;
import br.com.conhecimento.core.data.GestaoDemandaPrioridadeDao;
import br.com.conhecimento.core.data.GestaoDemandaReceitaDao;
import br.com.conhecimento.core.data.GestaoDemandaStatusDao;
import br.com.conhecimento.core.data.GestaoUsuarioDao;
import br.com.conhecimento.core.model.GestaoCliente;
import br.com.conhecimento.core.model.GestaoDemandaFlag;
import br.com.conhecimento.core.model.GestaoDemandaPendencia;
import br.com.conhecimento.core.model.GestaoDemandaPrioridade;
import br.com.conhecimento.core.model.GestaoDemandaReceita;
import br.com.conhecimento.core.model.GestaoDemandaStatus;
import br.com.conhecimento.core.model.GestaoUsuario;
import br.com.conhecimento.ejb.client.vo.funcionalidade.ConsultaComboVO;
import br.com.conhecimento.ejb.client.vo.modelo.ComboVO;
import br.com.conhecimento.ejb.server.util.Utils;

@Service
@Transactional
public class DemandaUtilService {

	@Autowired
	private GestaoDemandaStatusDao gestaoDemandaStatusDao;

	@Autowired
	private GestaoDemandaFlagDao gestaoDemandaFlagDao;

	@Autowired
	private GestaoDemandaPendenciaDao gestaoDemandaPendenciaDao;

	@Autowired
	private GestaoDemandaPrioridadeDao gestaoDemandaPrioridadeDao;

	@Autowired
	private GestaoDemandaReceitaDao gestaoDemandaReceitaDao;

	@Autowired
	private GestaoDemandaClienteDao gestaoDemandaClienteDao;

	@Autowired
	private GestaoUsuarioDao gestaoUsuarioDao;

	@Autowired
	private JavaMailSender mailSender;

	@Autowired
	private SimpleMailMessage alertMailMessage;

	public ConsultaComboVO consultarComboPrioridades() {

		ConsultaComboVO consulta = new ConsultaComboVO();

		try {
			List<GestaoDemandaPrioridade> prioridades = gestaoDemandaPrioridadeDao
					.findAll();

			if (prioridades == null) {
				consulta.setStatus(ConsultaComboVO.StatusConsultaComboVOEnum.ERRO);
				return consulta;
			}

			if (prioridades.isEmpty()) {
				consulta.setStatus(ConsultaComboVO.StatusConsultaComboVOEnum.NAO_POSSUI_REGISTROS);
				return consulta;
			}

			for (GestaoDemandaPrioridade p : prioridades) {
				ComboVO item = new ComboVO();
				item.setId(p.getId());
				item.setDescricao(p.getDescricao());

				consulta.getItens().add(item);
			}

		} catch (Exception e) {
			Utils.sendMailException(alertMailMessage, mailSender,
					"ERRO AO CONSULTAR COMBO DE PRIORIDADES", e);
		}

		consulta.setStatus(ConsultaComboVO.StatusConsultaComboVOEnum.SUCESSO);
		return consulta;

	}

	public ConsultaComboVO consultarComboStatus() {

		ConsultaComboVO consulta = new ConsultaComboVO();

		try {
			List<GestaoDemandaStatus> prioridades = gestaoDemandaStatusDao
					.findAll();

			if (prioridades == null) {
				consulta.setStatus(ConsultaComboVO.StatusConsultaComboVOEnum.ERRO);
				return consulta;
			}

			if (prioridades.isEmpty()) {
				consulta.setStatus(ConsultaComboVO.StatusConsultaComboVOEnum.NAO_POSSUI_REGISTROS);
				return consulta;
			}

			for (GestaoDemandaStatus p : prioridades) {
				ComboVO item = new ComboVO();
				item.setId(p.getId());
				item.setDescricao(p.getDescricao());

				consulta.getItens().add(item);
			}

		} catch (Exception e) {
			Utils.sendMailException(alertMailMessage, mailSender,
					"ERRO AO CONSULTAR COMBO DE PRIORIDADES", e);
		}

		consulta.setStatus(ConsultaComboVO.StatusConsultaComboVOEnum.SUCESSO);
		return consulta;
	}

	public ConsultaComboVO consultarComboFlag() {

		ConsultaComboVO consulta = new ConsultaComboVO();

		try {
			List<GestaoDemandaFlag> prioridades = gestaoDemandaFlagDao
					.findAll();

			if (prioridades == null) {
				consulta.setStatus(ConsultaComboVO.StatusConsultaComboVOEnum.ERRO);
				return consulta;
			}

			if (prioridades.isEmpty()) {
				consulta.setStatus(ConsultaComboVO.StatusConsultaComboVOEnum.NAO_POSSUI_REGISTROS);
				return consulta;
			}

			for (GestaoDemandaFlag p : prioridades) {
				ComboVO item = new ComboVO();
				item.setId(p.getId());
				item.setDescricao(p.getDescricao());

				consulta.getItens().add(item);
			}

		} catch (Exception e) {
			Utils.sendMailException(alertMailMessage, mailSender,
					"ERRO AO CONSULTAR COMBO DE PRIORIDADES", e);
		}

		consulta.setStatus(ConsultaComboVO.StatusConsultaComboVOEnum.SUCESSO);
		return consulta;
	}

	public ConsultaComboVO consultarComboPendencia() {

		ConsultaComboVO consulta = new ConsultaComboVO();

		try {
			List<GestaoDemandaPendencia> prioridades = gestaoDemandaPendenciaDao
					.findAll();

			if (prioridades == null) {
				consulta.setStatus(ConsultaComboVO.StatusConsultaComboVOEnum.ERRO);
				return consulta;
			}

			if (prioridades.isEmpty()) {
				consulta.setStatus(ConsultaComboVO.StatusConsultaComboVOEnum.NAO_POSSUI_REGISTROS);
				return consulta;
			}

			for (GestaoDemandaPendencia p : prioridades) {
				ComboVO item = new ComboVO();
				item.setId(p.getId());
				item.setDescricao(p.getDescricao());

				consulta.getItens().add(item);
			}

		} catch (Exception e) {
			Utils.sendMailException(alertMailMessage, mailSender,
					"ERRO AO CONSULTAR COMBO DE PRIORIDADES", e);
		}

		consulta.setStatus(ConsultaComboVO.StatusConsultaComboVOEnum.SUCESSO);
		return consulta;
	}

	public ConsultaComboVO consultarComboReceita() {

		ConsultaComboVO consulta = new ConsultaComboVO();

		try {
			List<GestaoDemandaReceita> prioridades = gestaoDemandaReceitaDao
					.findAll();

			if (prioridades == null) {
				consulta.setStatus(ConsultaComboVO.StatusConsultaComboVOEnum.ERRO);
				return consulta;
			}

			if (prioridades.isEmpty()) {
				consulta.setStatus(ConsultaComboVO.StatusConsultaComboVOEnum.NAO_POSSUI_REGISTROS);
				return consulta;
			}

			for (GestaoDemandaReceita p : prioridades) {
				ComboVO item = new ComboVO();
				item.setId(p.getId());
				item.setDescricao(p.getDescricao());

				consulta.getItens().add(item);
			}

		} catch (Exception e) {
			Utils.sendMailException(alertMailMessage, mailSender,
					"ERRO AO CONSULTAR COMBO DE PRIORIDADES", e);
		}

		consulta.setStatus(ConsultaComboVO.StatusConsultaComboVOEnum.SUCESSO);
		return consulta;
	}

	public ConsultaComboVO consultarComboCliente(Integer usuario) {

		ConsultaComboVO consulta = new ConsultaComboVO();

		try {
			GestaoUsuario usuarios = gestaoUsuarioDao.getUsuario(usuario);

			if (usuarios == null) {
				consulta.setStatus(ConsultaComboVO.StatusConsultaComboVOEnum.ERRO);
				return consulta;
			}

			if (usuarios.getClientes() == null) {
				consulta.setStatus(ConsultaComboVO.StatusConsultaComboVOEnum.ERRO);
				return consulta;
			}
			
			if (usuarios.getClientes().isEmpty()) {
				consulta.setStatus(ConsultaComboVO.StatusConsultaComboVOEnum.NAO_POSSUI_REGISTROS);
				return consulta;
			}

			for (GestaoCliente c : usuarios.getClientes()) {
				ComboVO item = new ComboVO();
				item.setId(c.getId());
				item.setDescricao(c.getDescricao());

				consulta.getItens().add(item);
			}

		} catch (Exception e) {
			Utils.sendMailException(alertMailMessage, mailSender,
					"ERRO AO CONSULTAR COMBO DE PRIORIDADES", e);
		}

		consulta.setStatus(ConsultaComboVO.StatusConsultaComboVOEnum.SUCESSO);
		return consulta;
	}

	public ConsultaComboVO consultarComboUsuarios() {

		ConsultaComboVO consulta = new ConsultaComboVO();

		try {
			List<GestaoUsuario> prioridades = gestaoUsuarioDao.findAll();

			if (prioridades == null) {
				consulta.setStatus(ConsultaComboVO.StatusConsultaComboVOEnum.ERRO);
				return consulta;
			}

			if (prioridades.isEmpty()) {
				consulta.setStatus(ConsultaComboVO.StatusConsultaComboVOEnum.NAO_POSSUI_REGISTROS);
				return consulta;
			}

			for (GestaoUsuario p : prioridades) {
				ComboVO item = new ComboVO();
				item.setId(p.getId());
				item.setDescricao(p.getNome());

				consulta.getItens().add(item);
			}

		} catch (Exception e) {
			Utils.sendMailException(alertMailMessage, mailSender,
					"ERRO AO CONSULTAR COMBO DE PRIORIDADES", e);
		}

		consulta.setStatus(ConsultaComboVO.StatusConsultaComboVOEnum.SUCESSO);
		return consulta;
	}
}
